package composantes;

public class TransfertEnergie {
	private Cellule _src,
					_dst;
	
	public TransfertEnergie(){
		clear();
	}
	
	public TransfertEnergie(Cellule src, Cellule dst) throws Exception{
		init(src, dst);
	}
	
	public Cellule getSrc(){
		return _src;
	}
	
	public Cellule getDst(){
		return _dst;
	}
	
	public void init(Cellule src, Cellule dst) throws Exception{
		if(src == dst)
			throw new Exception("Exception de transfert dans la meme cellule");
		_src = src;
		_dst = dst;
	}
	
	public void clear(){
		_src = _dst = null;
	}
	
	public void ajouterSrc(Cellule src) throws Exception{
		if(src.getEtat() == 0)
			throw new Exception("Exception de src == 0");
		_src = src;
	}
	
	public void ajouterDst(Cellule dst) throws Exception{
		//============Général=================
		if(_src == dst){
			_src = null;
			throw new Exception("Exception de src == dst");
		}
		
		//============Amies===================
		if(amis(dst, _src)){
			if(dst.getEtat() == 2){
				_src = null;
				throw new Exception("Exception de dst == 2 qui se fait aider");
			}
			
			if(_src.getEtat() == 1){
				if(dst.getEtat() != 1){
					_src = null;
					throw new Exception("Exception de src == 1 qui aide dst != 1");
				}
			}
		}
		//============Ennemies================
		else{
			if(_src.getEtat() != 2){
				_src = null;
				throw new Exception("Exception de src.getEtat() != 2 qui attaque");
			}
		}
		
		_dst = dst;
	}
	
	public boolean amis(){
		return (_src.getType() == _dst.getType()) || (_dst.getEtat() == 0);
	}
	
	private boolean amis(Cellule c1, Cellule c2){
		return c1.getType() == c2.getType();
	}
	
	public boolean possible(){
		if(_src == null || _dst == null)
			return false;
		
		if(amis()){
			if(!_src.peutPerdreEtat() || !_dst.peutGagnerEtat())
				return false;
		}else{
			if(!_src.peutPerdreEtat() || !_dst.peutPerdreEtat())
				return false;
		}
		
		return true;
	}
	
	public void transferer() {
		if(_dst.getEtat() == 0)
			_dst.setType(_src.getType());
		if(amis()){
			_src.perdreEtat();
			_dst.gagnerEtat();
		}else{
			_src.perdreEtat();
			_dst.perdreEtat();
		}
		clear();
	}
}